/****************************************************************************
 *
 * This file is part of Ct-lang-dev.
 *
 * Ct-lang-dev is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
 * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later
 * version.
 *
 * Ct-lang-dev is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with Foobar. If not, see
 * <http://www.gnu.org/licenses/>.
 *
 ***************************************************************************/
package ctalkobt.lang.meme;

/**
 * Definition of a concrete or abstract basic knowledge unit. Knowledge units can be composed by relationships to
 * other Memes. 
 *
 * @author Craig Taylor
 */
public interface Meme
{
    /**
     * Memes are either concrete (physical) or abstract (eg: aspect of, or descriptive ... ). 
     * 
     * @return 
     */
    boolean isAbstract();

    /**
     * External Reference is used for debugging / logging purposes only when rendering memes.  They may contain
     * english references but may not always for internally cretaed memes.
     *
     * @return
     *
     */
     // @@TODO: Should toString() be used for this?
     String getExternalReference();

    /**
     * Establishes a relation betwen this and 1 or more other meme's with an absolute weighting.
     * 
     * @param relation
     * @param meme
     */
    void addRelation(MemeRelation relation, Meme ... memes);

    /**
     * Establishes a relation between this and 1 or more other meme's with the given weighting. 
     * @param relation
     * @param weighting -100 to 100
     * @param memes
     */
    void addRelation(MemeRelation relation, Integer weighting, Meme ... memes);
    
}
